package iodemo;

import org.apache.commons.io.FileUtils;

import java.io.*;

/**
 * 常见的IP流方法
 *
 * 基石抽象类
 * InputStream & OutPutStream：读（返回int类型【0 - 255】，没有读到返回-1）或写一个字节；可用System.in System.out键盘输入/输出
 * Reader & Writer：读（返回int类型【0 - 65535{Unicode值}】，没有读到返回-1）或写一个字节
 * 文件字节流
 * FileInputStream & FOS：可以添加一个byte[]类型的缓冲数组，长度为2^n次方，写入格式byte[], 0, temp表明从0开始写，写到第temp-1
 * 缓冲字节流-----处理流
 * BufferInputStream & BOS：默认一次读取8192个字节（可手动修改）
 * 文件字符流-----字符流只能读文本文件
 * FileReader & FileWriter：可以通过\n换行，\r回车
 * 缓冲字符流
 * BufferReader & BufferWriter：readLine()可以一次读取一行
 * 转换流
 * InputStreamReader & OutputStreamWriter：将输入字节转换为字符，输出字符转换为字节；要在内部加入执行标准
 * 字符输出流
 * PrintWriter：可以使用println实现自动换行
 * 对象流
 * ObjectInputStream & OOS：可以读写自定义对象，是DataInputSteam & DataOutputStream的超集
 * 可以实现对象的序列化（对象 -> 二进制数据）和反序列化（二进制数据 -> 对象）
 *
 * 将File类添加到IO流中，可以在堆文件进行IO流操作时对文件进行一些操作
 *
 * ApacheIO包：阿帕奇软件基金会IO包，加入到lib目录内并添加到架包使用FileUtils方法，提升IO效率
 */
public class IOFileStream
{
    public static void main (String[] args) throws IOException
    {
        //通过文件字符流读取文本文件并用字符输出流打印到新文件
        try(BufferedReader bufferedReader = new BufferedReader(new FileReader(
                "D:/企业微信/WXWork/4.1.9.6012/wemail/js/_main.js.LICENSE.txt"));

            PrintWriter printWriter = new PrintWriter(
                    "D:/CopyCode_TestPrintWriter.txt");)
        {
            long timeBufferStart = System.currentTimeMillis();

            String str = null;
            StringBuilder stringBuilder = new StringBuilder();

            while((str = bufferedReader.readLine()) != null)
            {
                System.out.println(str);

                stringBuilder.append(str + "\n");

                printWriter.println(str);
            }

            long timeBufferEnd = System.currentTimeMillis();

            System.out.println();
            System.out.println(stringBuilder);
            System.out.println();

            System.out.println("文件字符流耗时：" + (timeBufferStart - timeBufferEnd));
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        
        //利用阿帕奇包复制文件
        long timeApacheStart = System.currentTimeMillis();
        
        FileUtils.copyFile(new File("D:/CopyCode_TestPrintWriter.txt"), new File("D:/CopyCode_Apache.txt"));
        
        long timeApacheEnd = System.currentTimeMillis();
    
        System.out.println("阿帕奇文件复制耗时：" + (timeApacheEnd - timeApacheStart));
    }
}
